package me.mingshan.leetcode;

import java.util.HashSet;
import java.util.Set;

/**
 * https://leetcode.cn/problems/linked-list-cycle-ii/description/
 *
 * 给定一个链表的头节点  head ，返回链表开始入环的第一个节点。 如果链表无环，则返回 null。
 *
 * 如果链表中有某个节点，可以通过连续跟踪 next 指针再次到达，则链表中存在环。 为了表示给定链表中的环，评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置（索引从 0 开始）。如果 pos 是 -1，则在该链表中没有环。注意：pos 不作为参数进行传递，仅仅是为了标识链表的实际情况。
 *
 * 不允许修改 链表。
 *
 * @author hanjuntao
 * @date 2025/8/7 0007
 */
public class L_142_linked_list_cycle_ii {

    public static void main(String[] args) {
        ListNode node1 = new ListNode(3);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(0);
        ListNode node4 = new ListNode(-4);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node2;

        ListNode listNode = detectCycle(node1);
        System.out.println(listNode.val);
    }

    /**
     * 思路：
     *
     * 可以用hash表来解决
     *
     *
     * @param head
     * @return
     */
    public static ListNode detectCycle(ListNode head) {
        if (head == null) {
            return null;
        }

        Set<ListNode> set = new HashSet<>();

        ListNode curr = head;

        // 定义快慢指针，快指针每次走两步，慢指针每次走一步
        while (curr != null) {
            if (set.contains(curr)) {
                return curr;
            }

            set.add(curr);
            curr = curr.next;
        }

        return null;
    }
}
